<?php

namespace app\common\traits;

/**
 * 错误信息Trait类
 */
trait ErrorTrait
{
    /**
     * 错误信息
     *
     * @var string
     */
    protected $error = [];
    protected $message = [];

    protected $method;
    /**
     * 设置额外方法，主要用于命令行执行调试输出
     * 使用方式：调用本方法并传入回调函数，函数中调用命令行输出到控制台
     * @param callable $fun
     */
    public function setMethod(callable $fun)
    {// 首先判断是否为可调用对象
        if (!is_callable($fun)) {
            return false;
        }
        $this->method = $fun;
        return $this;
    }

    /**
     * 设置消息信息
     *
     * @param string $error
     *
     * @return bool
     */
    protected function setMessage(string $message = ''): bool
    {
        $this->message[] = $message;
        if (is_callable($this->method)) {
            $this->method($message);
        }
        return true;
    }

    /**
     * 批量设置消息
     * @param array $messages
     * @return bool
     */
    protected function setMessages(array $messages = []): bool
    {
        foreach ($messages as $message) {
            $this->setMessage($message);
        }
        return true;
    }
    /**
     * 设置错误信息
     *
     * @param string $error
     *
     * @return bool
     */
    protected function setError(string $error): bool
    {
        $this->error[] = $error ?: '没有报错！';
        if (is_object($this->method)) {
            $this->method($error);
        }
        return false;
    }

    /**
     * 设置多个错误
     * @param array $errors
     * @return bool
     */
    protected function setErrors(array $errors = []): bool
    {
        foreach ($errors as $error) {
            $this->setError($error);
        }
        return false;
    }
    /**
     * 获取消息数组
     * @return array
     */
    public function getMessage(): array
    {
        return $this->message;
    }
    /**
     * 获取错误信息
     *
     * @return array
     */
    public function getError(): array
    {
        return $this->error;
    }
    /**
     * 是否存在错误信息
     *
     * @return bool
     */
    public function hasMesage(): bool
    {
        return !empty($this->message);
    }
    /**
     * 是否存在错误信息
     *
     * @return bool
     */
    public function hasError(): bool
    {
        return !empty($this->error);
    }

    /**
     * 是否存在错误信息
     *
     * @return bool
     */
    public function delError(): bool
    {
        $this->error = [];
        return true;
    }
}